anyenv のススメ
anyenv は以前、西村が紹介していましたが、これは現時点の最新情報とあわせてのアップデート記事です。
Tech Lead のお仕事紹介の第 4 弾にあたります。
追記: asdf について
はてなブックマークで asdf というツールを教えていただきました。シングルバイナリーで動作し、プロジェクトに必要な依存バージョンを .tool-versions
というファイルひとつで共有可能なものです。
とりあえず試してみようとしたのですが、まだインストールに難があるようで手元で動きませんでした。もう少し安定したらとても良い選択肢となりそうなので注目しています。現時点での選択可能な手段としては anyenv が良いでしょう。
contributer の方にサポートしてもらってインストールができたので試してみました。チームがメインで使っている Node.js のサポートがもう一歩なこと、グローバルインストールするツールは使わないため旨味があまりないことがわかったので改めて anyenv を採用することにしました。
教えていただいた方々、ありがとうございました。
anyenv とは
公式サイトは GitHub repository です。
https://github.com/anyenv/anyenv
プログラミング言語はバージョンによってサポートする機能が異なります。バージョンを上げることによって以前まで許容されていた書き方ができなくなったり、開発者にうれしい機能が追加されることがあります。
また、プロジェクトによって現在使用しているバージョンが異なるという状況も容易に発生します。こういった場合、同一言語でも複数バージョンをインストールしておく必要がありますが、標準ツールとしてサポートしている言語、サードパーティーでそういったツールが用意されている言語、複数バージョンをインストール不可能な言語など、ばらつきがありました。
一時期 Docker などコンテナー技術を用いて開発環境を作成するなどで回避されていましたが、オーバーヘッドが大きくメンバーごとのカスタマイズがしづらい難点がありました。
anyenv は現在使われている主要な言語をサポートし、複数のバージョンをインストール、管理可能なツールです。一元的な管理が可能なだけでなく、たいていの言語のバージョンコントロールも可能なため、使用したいツールの依存を解決しやすくなるという利点も持っています。さらに、あるディレクトリー以下で特定のバージョンを用いる、という設定も可能なため、最初に適切に設定しておくことでプロジェクト間のバージョンの違いを意識せずともよくなります。
インストール
macOS であれば Homebrew が使用可能です。
brew install anyenv anyenv init
その他の OS では Git repository の clone と設定が必要です。公式の手順を参照してください。
各言語の設定
よく使われるであろう言語の設定例をまとめます。
Node.js
インストール
以前は nenv
と ndenv
というコマンドが提供されていましたが既にメンテナンスされていないという理由で nodenv
サポートへ切り替わりました。
Node.js 製のツールが多いため、入れておくと何かと便利です。
nodenv
をインストールしましょう。
anyenv install nodenv
最近の Node.js は非常に安定していますが、プロジェクトで使用するバージョンは LTS: Long Term Support の最新版とするとよいでしょう。リリーススケジュールやメーリングリストで LTS バージョンのリリース時期を把握し、適切なバージョンを選択しましょう。ちなみに LTS はメジャーバージョンが偶数のものです。
インストール可能なバージョンは install
サブコマンドに -l
もしくは --list
オプションを付与することで確認可能です。
nodenv install --list
が、 io.js も含めたすべてのバージョンが表示されるため、見づらいでしょう。最近のものだけ表示するために、 grep
で正規表現を用いて絞り込むと良いでしょう。次はメジャーバージョン 10 以上のものだけ表示しています。
nodenv install -l | grep -E '^1\d'
現在 LTS であるバージョン 12 系の最新をインストールしたい場合は次のコマンドを実行しましょう。
nodenv install $(nodenv install -l | grep -E '^12' | grep -v dev | tail -1)
設定
普段使うバージョンは global
サブコマンドで指定します。
基本的にインストールしたすべてのバージョンのうち、最新を使うこととしましょう。
nodenv global 12.16.3
バージョン指定が面倒くさい場合は次を実行しましょう。
nodenv global $(nodenv versions | tail -1 | tr '*' ' ' | awk '{print $1}')
各プロジェクトで使うバージョンを指定するには local
サブコマンドを使いましょう。
nodenv local 12.16.1
local
サブコマンドを実行すると、現在のディレクトリー直下に .node-version
ファイルが生成されます。中身はバージョンが書かれているだけですが、 nodenv
がインストールされているマシンではこのファイルを参照して、自動的に使用するバージョンを切り替えてくれます。メンバーと設定を共有するため、 Git 管理化におくと良いでしょう。
メンバーが指定したバージョンをインストールしていない場合、 node
コマンドの実行時に次のようなメッセージが出力されます。この場合は該当バージョンを適宜インストールしましょう。
nodenv: version `10.16.3' is not installed (set by /Users/takagi.kensuke/work/dev/experiments/node/fix-version/.node-version)
Ruby
Ruby は様々なツールで使われているため、これも anyenv で管理してしまいましょう。ただし、使い方は nodenv と同様です。
anyenv install rbenv rbenv install $(rbenv install -l | grep -E '^2' | grep -v dev | tail -1) rbenv global $(rbenv versions | tail -1 | tr '*' ' ' | awk '{print $1}') gem install bundler
現在の rbenv は rehash
サブコマンドを実行する必要がないため、これで初期設定完了です。
各プロジェクトで local
サブコマンドを使い、使用する ruby
バージョンを固定してください。 .ruby-version
ファイルが生成されますので、 Git 管理に追加しましょう。
Python
Python も便利なツールの依存となっていることが多い言語です。基本は nodenv / rbenv と同様ですが、野村がpyenv + virtualenv での環境構築について詳しくまとめていますので参照してください。
まとめ
とても簡単に複数のバージョンを管理可能なツールです。各メンバーがインストールしているとチームとしての開発効率も上がります。ぜひ有効活用しましょう。